import time
import sys

import RPi.GPIO as GPIO

from bases.config import * 

'''
键盘与IO专用类，面向对象编程，将键盘相关代码组织成类与对象
'''
class Keyboard(object):
    
    keyMatrix = [
        ['1', '2', '3', 'Counter'],
        ['4', '5', '6', '0'],
        ['7', '8', '9', 'PowerKey']
    ]

    # 列号？行号？ 映射到树莓派GPIO口
    rowmap = {
        0 : 6,
        1 : 13,
        2 : 19,
        #3 : 5,
    }
    
    # 列位置映射到树莓派GPIO口
    colmap = {
        0 : 1,
        1 : 16,
        2 : 20,
        3 : 21
    }

    prevousKey = ''
    insistTimes = 0

    '''
    初始化IO口
    '''
    @staticmethod
    def gpioinit():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(Din1, GPIO.IN)
        GPIO.setup(Din2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(LedPin, GPIO.OUT)
        GPIO.output(LedPin, 0)

        GPIO.setup(L1, GPIO.OUT)
        GPIO.setup(L2, GPIO.OUT)
        GPIO.setup(L3, GPIO.OUT)
        GPIO.setup(L4, GPIO.OUT)
        
        GPIO.setup(Column1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.setup(Column2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.setup(Column3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.setup(Column4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    
    '''
    扫描键盘，抛出事件,
    这里不再做循环，循环放到外面控制
    '''
    def scan(self, queue):
        # LED 补光延时 （取消在这里控制，放到图像检测那边做控制以及延时）
        # ledLightDelay = 3

        key = ''
        # 循环行
        for row in self.rowmap:
            # 拉高行线，准备扫描列线
            GPIO.output(self.rowmap[row], GPIO.HIGH)
            
            # 循环列读取列（按键）
            for col in self.colmap:
                if GPIO.input(self.colmap[col]) == 1:
                    key = self.keyMatrix[row][col]
            
            # 重置（拉低行线）
            GPIO.output(self.rowmap[row], GPIO.LOW)


        # 读行程开关状态,GPIO(26)行程开关0是打开
        if GPIO.input(Din2) == 0:
            # 这里应该抛出事件
            #GPIO.output(LedPin, GPIO.HIGH)
            #print("行程开关已开")
            key = 'lightOpen'

    
        #长按电源按键，关闭树莓派
        if (key==self.prevousKey and len(key)>0):
            self.insistTimes=self.insistTimes+1
            if(self.insistTimes>200):
                self.insistTimes=0
                queue.put(key+'-Long')


        # 新按键不为空，并且不等于之前的按键，触发新按键消息
        if( key != self.prevousKey) :
            self.prevousKey = key
            if len(key) > 0 :
                queue.put(key)
                #print(key +  'Pressed')
